<?php
/**
 * Modelo CRUD de envios
 * @author Emanuel Melo e Renato Lenz @ PC4 Team
 */
class PC4_Crud_Newsletter_Envio extends PC4_Crud_Abstrato_Rastreado {
	
	/**
	 * Construtor
	 */
	function __construct($tabela = 'envios') {
		parent::__construct($tabela);
	}
	
	/**
	 * 
	 * @param $campos(nome/valor)
	 * @return devolve um array de erros(nomeCampo/erro) para cada campo que não passou na validação
	 */
	function valida($campos, $id=0) {
		$erros = array();
		
		return $erros;
	}
	
	/**
	 * Executa uma consulta trazendo os registros com paginação
	 * @param int $pagina
	 * @param int $registros
	 * @return array de registros
	 */
	function listaDoCliente($id_cliente, $pagina = 1, $registros = 20) {
		$this->db->select('(
			    SELECT
			      COUNT(*)
			    FROM
			      informacoes_envio ie
			    WHERE
			      e.id = ie.id_envios
			      AND ie.`status` = 1
			  ) AS enviados,
			  (
			    SELECT
			      COUNT(*)
			    FROM
			      informacoes_envio ie
			    WHERE
			      e.id = ie.id_envios
			      AND ie.`status` = 0
			  ) AS nao_enviados,
			  (
			    SELECT
			      COUNT(*)
			    FROM
			      informacoes_envio ie
			    WHERE
			      e.id = ie.id_envios
			      AND ie.`status` = 1
			      AND ie.api_return_code <> \'\'
			      AND ie.data_entrega IS NULL
			  ) AS n_erros,
			  e.*', false);
		$this->db->where('e.id_clientes = ' . $id_cliente);
		$rs = parent::lista($pagina, $registros);
		
		return $rs;
	}
		
	/**
	 * Recebe um array com os campos e insere na base de dados o novo registro
	 * @param array $umRegistro
	 * @return O id inserido ou um array com mensagens de erro
	 */
	function insere($umRegistro) {
		if (empty($umRegistro['destinatarios'])) {
			$erros['destinatarios'] = "Escolha pelo menos um destinat&aacute;rio.";
			return $erros;
		}

		// Carrega os modelos para manipulação
		$mMensagens = new PC4_Crud_Newsletter_Mensagem();
		$mCredito = new PC4_Crud_Newsletter_Credito();
		$mInfo = new PC4_Crud_Newsletter_InformacaoEnvio();
		
		// Separa os campos de outras tabelas
		$id_mensagem = $umRegistro['id_mensagem'];
		unset($umRegistro['id_mensagem']);
		$destinatarios = $umRegistro['destinatarios'];
		unset($umRegistro['destinatarios']);
		
		// Recupera o assunto da mensagem
		$rMensagem = $mMensagens->ve($id_mensagem);
		$umRegistro['assunto'] = $rMensagem->assunto;
		$umRegistro['texto'] = $rMensagem->texto;
		
		$id_envio = parent::insere($umRegistro);
		
		if (is_numeric($id_envio)) {
			$credito = array(
				"id_clientes" => $umRegistro["id_clientes"],
				"id_envios" => $id_envio,
				"razao" => "Envio de mensagem",
				"valor" => 0
			);
			$mCredito->insere($credito);
			foreach ($destinatarios as $id_destinatario) {
				$destinatario = array(
					"id_envios" => $id_envio,
					"id_mensagem" => $id_mensagem,
					"id_destinatarios" => $id_destinatario
				);
				$mInfo->insere($destinatario);
			}
		}
		
		return $id_envio;
	}
	
	/**
	 * Retona object de registro
	 * @param array $registro
	 * @return Retona object do registro
	 */
	function trataRegistro($registro) {
		$registro->data_inicio = sql2date($registro->data_inicio, "d/m/Y H:i");
		$totalEnvios = $registro->enviados + $registro->nao_enviados;
		
		if($totalEnvios == 0)
			$totalEnvios = 1;
		$porcentagem = ($registro->enviados / $totalEnvios) * 100;
		$registro->status = str_replace(",00","",number_format($porcentagem, 2, ",", ""))."%";
		
		if ($registro->ativo == 0) {
			$registro->status = "CANCELADO - " . $registro->status;
		}
		else {
			switch ($porcentagem) {
				case 0:
					$registro->status = "PROGRAMADA";
					break;
				case 100:
					$registro->status = "CONCLUÍDO";
					break;
				default:
					$registro->status = "ENVIANDO - " . $registro->status;
					break;
			}
		}

		return $registro;
	}
	
	/**
	 * Apaga um registro
	 * @param int $id
	 * @param string o nome alternativo para a chave primaria
	 * @return int linhas afetadas
	 */
	function apaga($id, $nome_id = 'id') {
		// Carrega os modelos para manipulação
		$ie_model =  new PC4_Crud_Newsletter_InformacaoEnvio();
		
		$rs = $ie_model->consulta(array('status' => 1, 'id_envios' => $id));
		
		if(empty($rs)) {
			$CI->ie_model->apaga($id, 'id_envios');
			return parent::apaga($id);
		}
		else {
			return $this->ativaDesativa($id, 0);
		}
	}
	
	/**
	 * Ativa e Desativa um registro
	 * @param int $id
	 * @param array $set
	 * @return true - ativado, false - erro
	 */
	function ativaDesativa($id, $set) {
		$resultado = parent::ativaDesativa($id, $set);
		$this->db->update("informacoes_envio", array('ativo' => $set), "id_envios = $id");
	
		return $resultado;
	}
	
}
?>